package 多态.避免在构造方法中调用重写的方法;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 姚东名
 * Date: 2024-06-16
 * Time: 22:11
 */
//一段有坑的代码. 我们创建两个类, B 是父类, D 是子类. D 中重写 func 方法. 并且在 B 的构造方法中调用 func
class B {
    public B() {
        //...
        func();
    }
    public void func() {
        System.out.println("B.func()");
    }
}
class D extends B {
    private int num = 1;

    @Override
    public void func() {
        System.out.println("D.func()：" + this.num);
    }
}
public class Test {
    public static void main(String[] args) {
        D d = new D();
    }
}

/*
执行结果：
D.func()：0
 */

/*
【解释】
    - 构造D对象的同时，会调用B的构造方法
    - B的构造方法中调用了func()方法，此时会触发动态绑定，会调用到D中的func
    - 此时D对象自身还没有构造，此时num处于未初始化的状态，值为0，如果具备多态性，num的知应该为1
    - 所以在构造函数内，尽量避免使用实例方法，除了final和private方法

结论: "用尽量简单的方式使对象进入可工作状态", 尽量不要在构造器中调用方法(如果这个方法被子类重写, 就会触
发动态绑定, 但是此时子类对象还没构造完成), 可能会出现一些隐藏的但是又极难发现的问题。
 */
